<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>pyftpdlib Release Notes</title>
</head>

<body>
<div id="wikicontent">
  <h1><a id="Version:_0.3.0_-_Date:_2008-01-17">Version: 0.3.0 - Date: 2008-01-17</a></h1>
  <h2><a id="Major_enhancements">Major enhancements</a></h2>
  <ul>
    <li><a title="Provide permissions, owner, and group for files on UNIX platforms" href="http://code.google.com/p/pyftpdlib/issues/detail?id=48">Issue 48</a>: real permissions, owner, and group for files on UNIX platforms are now provided when processing LIST. </li>
    <li><a title="Bandwidth throttling capabilities and updated throttled_ftpd.py script" href="http://code.google.com/p/pyftpdlib/issues/detail?id=51">Issue 51</a>: added the new demo/throttled_ftpd.py script. </li>
    <li><a title="Using iterators when calculating requests requiring long time to complete (LIST and MLSD commands)" href="http://code.google.com/p/pyftpdlib/issues/detail?id=59">Issue 59</a>: iterators are now used for calculating requests requiring long time to complete (LIST and MLSD commands). </li>
    <li><a title="Extend the set of user permissions" href="http://code.google.com/p/pyftpdlib/issues/detail?id=61">Issue 61</a>: extended the set of assignable user permissions. </li>
  </ul>
  <h2><a id="RFC-related_enhancements">RFC-related enhancements</a></h2>
  <ul>
    <li><a title="Implement FEAT command" href="http://code.google.com/p/pyftpdlib/issues/detail?id=42">Issue 42</a>: implemented <strong>FEAT</strong> command defined in <a href="http://www.faqs.org/rfcs/rfc2389.html" rel="nofollow">RFC-2389</a>. </li>
    <li><a title="Implementing MLST and MLSD commands" href="http://code.google.com/p/pyftpdlib/issues/detail?id=52">Issue 52</a>: implemented <strong>MLST</strong> and <strong>MLSD</strong> commands defined in <a href="http://www.faqs.org/rfcs/rfc3659.html" rel="nofollow">RFC-3659</a>. </li>
    <li><a title="Implement OPTS command" href="http://code.google.com/p/pyftpdlib/issues/detail?id=58">Issue 58</a>: implemented <strong>OPTS</strong> command define in <a href="http://www.faqs.org/rfcs/rfc2389.html" rel="nofollow">RFC-2389</a>. </li>
  </ul>
  <h2><a id="Bugfixes">Bugfixes</a></h2>
  <ul>
    <li><a title="Error on QUIT when user is not yet authenticated" href="http://code.google.com/p/pyftpdlib/issues/detail?id=41">Issue 41</a>: error occurred on quit if user was not yet authenticated. </li>
    <li><a title="Server ident shouldn't be shown in the STAT response" href="http://code.google.com/p/pyftpdlib/issues/detail?id=43">Issue 43</a>: hidden the server identifier when returning STAT response. </li>
    <li><a title="Wrong PORT response code if data-connection attempt fails" href="http://code.google.com/p/pyftpdlib/issues/detail?id=44">Issue 44</a>: a wrong response code was given on PORT if the data connection attempt failed. </li>
    <li><a title="Wrong HELP response code on unknown arg command" href="http://code.google.com/p/pyftpdlib/issues/detail?id=45">Issue 45</a>: a wrong response code was given on HELP if argument was incorrect. </li>
    <li><a title="Wrong response on rejected data connection" href="http://code.google.com/p/pyftpdlib/issues/detail?id=46">Issue 46</a>: a wrong response code was given on PASV if remote peer had a foreign internet address. </li>
    <li><a title="Maximum connections limit problem on Python 2.3" href="http://code.google.com/p/pyftpdlib/issues/detail?id=47">Issue 47</a>: can't use FTPServer.max_cons option with Python 2.3. </li>
    <li><a title="Provide permissions, owner, and group for files on UNIX platforms" href="http://code.google.com/p/pyftpdlib/issues/detail?id=48">Issue 48</a>: problem when LISTing &quot;broken&quot; symbolic links. </li>
    <li><a title="Problem when LISTing " broken="" symbolic="" links="" href="http://code.google.com/p/pyftpdlib/issues/detail?id=49">Issue 49</a>: data channel did not respect the outgoing data buffer. </li>
    <li><a title="Problem when receiving strings with trailing white spaces" href="http://code.google.com/p/pyftpdlib/issues/detail?id=53">Issue 53</a>: received strings having trailing white spaces was erroneously stripped. </li>
    <li><a title="Sort LIST / NLST / STAT command output by file name" href="http://code.google.com/p/pyftpdlib/issues/detail?id=54">Issue 54</a>: LIST/NLST/STAT outputs are now sorted by file name. </li>
    <li><a title="Path traversal vulnerability in case of symlinks" href="http://code.google.com/p/pyftpdlib/issues/detail?id=55">Issue 55</a>: path traversal vulnerability in case of symlinks. </li>
    <li><a title="Can't rename broken symbolic links" href="http://code.google.com/p/pyftpdlib/issues/detail?id=56">Issue 56</a>: can't rename broken symbolic links. </li>
    <li><a title="Wrong LIST / NLST behavior with symbolic links" href="http://code.google.com/p/pyftpdlib/issues/detail?id=57">Issue 57</a>: wrong LIST/NLST behavior when processing symbolic links. </li>
    <li><a title="Error in case of bad formatted PORT command requests" href="http://code.google.com/p/pyftpdlib/issues/detail?id=60">Issue 60</a>: error occurred in case of bad formatted PORT command requests. </li>
  </ul>
  <p> </p>
  <h2><a id="API_changes_since_0.2.0">API changes since 0.2.0</a></h2>
  <ul>
    <li><a id="API_changes_since_0.2.0">New IteratorProducer and BufferedIteratorProducer classes have been added. </a></li>
    <li><a id="API_changes_since_0.2.0">DummyAuthorizer class changes: </a></li>
    <ul>
      <li><a id="API_changes_since_0.2.0">The permissions management has been changed and the set of available permissions have been extended (see </a><a title="Extend the set of user permissions" href="http://code.google.com/p/pyftpdlib/issues/detail?id=61">Issue 61</a>). add_user() method now accepts &quot;eladfm&quot; permissions beyond the old &quot;r&quot; and &quot;w&quot;. </li>
      <li>r_perm() and w_perm() methods have been removed. </li>
      <li>New has_perm() and get_perms() methods have been added. </li>
    </ul>
    <li>AbstractedFS class changes: </li>
    <ul>
      <li>normalize() method has been renamed in ftpnorm(). </li>
      <li>translate() method has been renamed in ftp2fs(). </li>
      <li>New methods: fs2ftp(), stat(), lstat(), islink(), realpath(), lexists(), validpath(). </li>
      <li>get_list_dir(), get_stat_dir() and format_list() methods now return an iterator object instead of a string. </li>
      <li>format_list() method has a new &quot;ignore_err&quot; keyword argument. </li>
    </ul>
    <li>global debug() function has been removed. </li>
  </ul>
  <h2><a id="Porting_to_pyftpdlib_0.3.0">Porting to pyftpdlib 0.3.0</a></h2>
  <p><a id="Porting_to_pyftpdlib_0.3.0">This section lists previously described changes that may require changes to your existent 0.2.0-based code. </a></p>
  <p><a id="Porting_to_pyftpdlib_0.3.0">The main news in 0.3.0 version is that the DummyAuthorizer  class now provides an extended set of user permissions. For example: to  create a user having full r/w permissions you no longer have to do: </a></p>
  <pre>    <a id="Porting_to_pyftpdlib_0.3.0">authorizer.add_user(&quot;user&quot;, &quot;12345&quot;, &quot;/home/user&quot;, perm=(&quot;r&quot;,&quot;w&quot;))</a></pre>
  <p><a id="Porting_to_pyftpdlib_0.3.0">...or: </a></p>
  <pre>    <a id="Porting_to_pyftpdlib_0.3.0">authorizer.add_user(&quot;user&quot;, &quot;12345&quot;, &quot;/home/user&quot;, perm=&quot;rw&quot;)</a></pre>
  <p><a id="Porting_to_pyftpdlib_0.3.0">...but instead: </a></p>
  <pre>    <a id="Porting_to_pyftpdlib_0.3.0">authorizer.add_user(&quot;user&quot;, &quot;12345&quot;, &quot;/home/user&quot;, perm=&quot;elradfmw&quot;)</a></pre>
  <p><a id="Porting_to_pyftpdlib_0.3.0">Folks who sub-classed DummyAuthorizer class to create their own custom authorizer (e.g. I've seen some SQL-based authorizers around) must note that r_perm() and w_perm() methods have been removed and replaced by the new has_perm() method. </a></p>
  <p><a id="Porting_to_pyftpdlib_0.3.0">Other changes are fundamentally related to AbstractedFS class which acquired some new methods and renamed others but this should interest only folks who sub-classed it (e.g. </a><a href="http://walco.n--tree.net/projects/aksy/wiki" rel="nofollow">Aksy library</a> which implemented a virtual file-system). </p>
  <p>&nbsp;</p>
  <p>&nbsp;</p>
</div>
</body>
</html>
